"""
下面是一个电子发票的xml文件，其中包含了发票的基本信息、购买方信息、销售方信息、发票明细等内容。
请根据这个xml文件的内容，编写一个解析xml文件的程序，将其中的发票信息提取出来，以字典的形式返回。
"""
xml_data = """
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EInvoice>
    <Header>
        <EIid>24517000000226726121</EIid>
        <EInvoiceTag>SWEI15100</EInvoiceTag>
        <Version>0.32</Version>
        <InherentLabel>
            <InIssuType>
                <LabelCode>Y</LabelCode>
                <LabelName>蓝字发票标志</LabelName>
            </InIssuType>
            <EInvoiceType>
                <LabelCode>01</LabelCode>
                <LabelName>电子发票</LabelName>
            </EInvoiceType>
            <GeneralOrSpecialVAT>
                <LabelCode>02</LabelCode>
                <LabelName>普通发票</LabelName>
            </GeneralOrSpecialVAT>
        </InherentLabel>
        <UndefinedLabel>
            <Label>
                <LabelType>发票开具方式标签</LabelType>
                <LabelCode>6</LabelCode>
                <LabelName>离线开票</LabelName>
            </Label>
        </UndefinedLabel>
    </Header>
    <EInvoiceData>
        <SellerInformation>
            <SellerIdNum>91510100MA6B7L2R7L</SellerIdNum>
            <SellerName>成都滴滴优行科技有限公司</SellerName>
            <SellerAddr>中国（四川）自由贸易试验区成都高新区和乐二街150号2栋1单元4-6层</SellerAddr>
            <SellerTelNum>010-83456275</SellerTelNum>
            <SellerBankName>招商银行股份有限公司成都锦江支行</SellerBankName>
            <SellerBankAccNum>128911422510101</SellerBankAccNum>
        </SellerInformation>
        <BuyerInformation>
            <BuyerIdNum>91510100MA65WDXH1K</BuyerIdNum>
            <BuyerName>成都橙极科技有限公司</BuyerName>
        </BuyerInformation>
        <BasicInformation>
            <TotalAmWithoutTax>455.03</TotalAmWithoutTax>
            <TotalTaxAm>13.66</TotalTaxAm>
            <TotalTax-includedAmount>468.69</TotalTax-includedAmount>
            <TotalTax-includedAmountInChinese>肆佰陆拾捌圆陆角玖分</TotalTax-includedAmountInChinese>
            <Drawer>侯娇</Drawer>
            <RequestTime>2024-11-10 13:24:44</RequestTime>
        </BasicInformation>
        <IssuItemInformation>
            <ItemName>*运输服务*客运服务费</ItemName>
            <SpecMod>无</SpecMod>
            <MeaUnits>次</MeaUnits>
            <Quantity>1</Quantity>
            <UnPrice>502.83</UnPrice>
            <Amount>502.83</Amount>
            <TaxRate>0.03</TaxRate>
            <ComTaxAm>15.09</ComTaxAm>
            <TotaltaxIncludedAmount>517.92</TotaltaxIncludedAmount>
            <TaxClassificationCode>3010101020102000000</TaxClassificationCode>
        </IssuItemInformation>
        <IssuItemInformation>
            <ItemName>*运输服务*客运服务费</ItemName>
            <Amount>-47.80</Amount>
            <TaxRate>0.03</TaxRate>
            <ComTaxAm>-1.43</ComTaxAm>
            <TotaltaxIncludedAmount>-49.23</TotaltaxIncludedAmount>
            <TaxClassificationCode>3010101020102000000</TaxClassificationCode>
        </IssuItemInformation>
        <SpecificInformation/>
        <AdditionalInformation/>
    </EInvoiceData>
    <SellerAuthentication>
        <AuthenticationMethods>01</AuthenticationMethods>
    </SellerAuthentication>
    <TaxSupervisionInfo>
        <InvoiceNumber>24517000000226726121</InvoiceNumber>
        <IssueTime>2024-11-10</IssueTime>
        <TaxBureauCode>15100000000</TaxBureauCode>
        <TaxBureauName>国家税务总局四川省税务局</TaxBureauName>
    </TaxSupervisionInfo>
</EInvoice>
"""
# 请在下面编写你的代码
import xmltodict
from tkinter import filedialog

def parse_xml(xml_data):
    # 将 xml 数据解析为 Python 字典
    #将下面的输入改成弹出文件选择框的方式
    #弹出文件选择框
    file_path = filedialog.askopenfilename()
    with open(file_path, "r", encoding="utf-8") as f:
        xml_data = f.read()

    tree = xmltodict.parse(xml_data)
    #xml文件分成了4个部分，分别是Header、EInvoiceData、SellerAuthentication、TaxSupervisionInfo
    #这里只需要Header、EInvoiceData、TaxSupervisionInfo部分的数据
    #Header部分包含了发票的基本信息,提取发票号码、发票类型。发票号码在 EIid 标签中，
    # 发票类型在 EInvoiceType 和GeneralOrSpecialVAT标签中的LabelName标签中，需要将两个标签的数据组合在一起
    #EInvoiceData部分包含了发票的详细信息，销售方名称、销售方统一社会信用代码、购买方名称、购买方统一社会信用代码、
    # 服务项目名称、服务项目数量、服务项目单价、服务项目金额、服务项目税率、服务项目税额、服务项目含税金额、服务项目分类编码
    # 一个发票可能包含多个服务项目，需要将每个服务项目的信息提取出来，以列表的形式保存
    #TaxSupervisionInfo部分包含了发票的基本信息，开票日期、税局代码、税局名称
    #将这些信息提取出来，以字典的形式返回
    header = tree['EInvoice']['Header']
    einvoice_data = tree['EInvoice']['EInvoiceData']
    tax_supervision_info = tree['EInvoice']['TaxSupervisionInfo']

    invoice_info = {
        '电子发票文件名': os.path.basename(file_path),
        '发票号码': header['EIid'],
        '发票代码': header['EInvoiceTag'],
        '发票类型': f"{header['InherentLabel']['EInvoiceType']['LabelName']} {header['InherentLabel']['GeneralOrSpecialVAT']['LabelName']}",
        '销售方名称': einvoice_data['SellerInformation']['SellerName'],
        '销售方-统一社会信用代码': einvoice_data['SellerInformation']['SellerIdNum'],
        '购买方名称': einvoice_data['BuyerInformation']['BuyerName'],
        '购买方-统一社会信用代码': einvoice_data['BuyerInformation']['BuyerIdNum'],
        '不含税金额': einvoice_data['BasicInformation']['TotalAmWithoutTax'],
        '总税额': einvoice_data['BasicInformation']['TotalTaxAm'],
        '含税金额': einvoice_data['BasicInformation']['TotalTax-includedAmount'],
        '开票日期': tax_supervision_info['IssueTime'],
        '税局代码': tax_supervision_info['TaxBureauCode'],
        '税局名称': tax_supervision_info['TaxBureauName'],
        '服务项目': [],
        '备注':''
    }

    for item in einvoice_data['IssuItemInformation']:
        # 服务项目名称、服务项目数量、服务项目单价、服务项目金额、服务项目税率、服务项目税额、服务项目含税金额、服务项目分类编码
        # 服务项目名称在 ItemName 标签中，服务项目数量在 Quantity 标签中，服务项目单价在 UnPrice 标签中，服务项目金额在 Amount 标签中，
        # 服务项目税率在 TaxRate 标签中，服务项目税额在 ComTaxAm 标签中，服务项目含税金额在 TotaltaxIncludedAmount 标签中，
        # 服务项目分类编码在 TaxClassificationCode 标签中
        # 上面这些标签可能有也可能没有，需要判断是否存在这些标签，如果不存在则使用默认值''
        # 请按上面的要求改写下面的代码

        service_item = {
            '项目名称': item.get('ItemName', ''),
            '项目数量': item.get('Quantity', ''),
            '项目单位': item.get('MeaUnits', ''),
            '项目单价': item.get('UnPrice', ''),
            '项目金额': item.get('Amount', ''),
            '项目税率': item.get('TaxRate', ''),
            '项目税额': item.get('ComTaxAm', ''),
            '项目含税金额': item.get('TotaltaxIncludedAmount', ''),
            '项目分类编码': item.get('TaxClassificationCode', '')
        }
        invoice_info['服务项目'].append(service_item)

    return invoice_info
    
    

result = parse_xml(xml_data)
print(result)
# 输出结果：
# {'发票号码': '24517000000226726121', '发票类型': '电子发票', '开票日期': '2024-11-10 13:24:44', '购买方名称': '成都橙极科技有限公司', '统一社会信用代码': '91510100MA65WDXH1K', '不含税金额': '455.03', '税额': '13.66', '电子客票号': '3010101020102000000', '出发站': '*运输服务*客运服务费', '目的站': '*运输服务*客运服务费', '车次号': '3010101020102000000', '出发日期': '2024-11-10', '发车时间': '2024-11-10 13:24:44', '座次': '次'}
# 请注意，这里的输出结果可能会因为xml文件的内容而有所不同，但是输出结果的格式应该是一样的。